import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

/**
 * 代码自动生成类
 */
public class CodeGenerator {
    public static void main(String[] args) {
        // 1、创建代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 2、全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");//设置工程所在目录
        gc.setOutputDir(projectPath + "\\admin\\src\\main\\java");//设置生成文件输出目录,所有生成的代码都放在src\main\java目录下
        gc.setAuthor("hotel");//作者,自行设置
        gc.setOpen(false);//生成后不打开文件管理器
        gc.setFileOverride(true); //重新生成时文件是否覆盖
        gc.setBaseResultMap(true);// XML ResultMap 生成xml文件通用返回集
        gc.setBaseColumnList(true);// XML columList 生成xml文件通用返回字段
        gc.setServiceName("%sService"); //去掉Service接口的首字母I
        gc.setIdType(IdType.AUTO); //主键策略,主键自增
        gc.setDateType(DateType.ONLY_DATE);//定义生成的实体类中日期类型

        gc.setSwagger2(false);//开启Swagger2模式

        mpg.setGlobalConfig(gc);

        // 3、数据库配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://1.15.181.28:3306/db_hotel?useSSL=false&characterEncoding=UTF8&serverTimezone=UTC");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");//设置驱动,注意版本号（8版本为cj.jdbc）
        dsc.setUsername("root");//用户名(名字缩写）
        dsc.setPassword("123456Dsj");//密码
        dsc.setDbType(DbType.MYSQL);//设置数据库类型

        mpg.setDataSource(dsc);

        // 4、包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(null); //模块名
        pc.setParent("com.gxa.hotel.admin");//设置生成的文件存放在哪个父包下
        pc.setEntity("pojo");//设置生成的实体类放在哪个包下
        pc.setService("service");//设置生成的service放在哪个包下
        pc.setMapper("mapper");//设置生成的mapper文件放在哪个包下
        pc.setServiceImpl("service.impl");//设置生成的impl放在哪个包下
        pc.setController("controller");//设置controller放在哪个包下
        pc.setXml("mapper.mapperxml");//设置xml文件放在哪个包下

        mpg.setPackageInfo(pc);

        // 5、策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setEntityLombokModel(true);
        strategy.setInclude(new String[]{"tb_goods"});//需要生成的表,多表用,隔开
        // strategy.setExclude(new String[]{"test"});// 排除生成的表
        strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略，驼峰
        strategy.setTablePrefix("tb_"); //生成实体时去掉表前缀
        // strategy.entityTableFieldAnnotationEnable(true);//实体属性上添加表字段映射
        strategy.setSuperServiceClass("");
        strategy.setSuperServiceImplClass("");
        strategy.setSuperMapperClass(null);

        // strategy.setSuperEntityClass("com.baomidou.demo.TestEntity");// 自定义实体父类,一般不需要
        // strategy.setSuperEntityColumns(new String[] { "test_id", "age" });// 自定义实体,公共字段,一般不需要
        // strategy.setSuperMapperClass("com.baomidou.demo.TestMapper");// 自定义 mapper 父类,一般不需要
        // strategy.setSuperServiceClass("com.baomidou.demo.TestService");// 自定义 service 父类,一般不需要
        // strategy.setSuperServiceImplClass("com.baomidou.demo.TestServiceImpl");// 自定义 service 实现类父类,一般不需要
        // strategy.setSuperControllerClass("com.baomidou.demo.TestController");// 自定义 controller 父类,一般不需要
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
//        strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作

        strategy.setRestControllerStyle(true); //restful api风格控制器
        strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符

        mpg.setStrategy(strategy);

        // 6、执行
        mpg.execute();
        System.out.println("代码生成完毕");
    }
}
